package com.langchain4j.core.llm.model;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

/**
 * 生成配置
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GenerationConfig {
    
    /**
     * 模型名称
     */
    private String modelName;
    
    /**
     * 温度（创造性）
     */
    @Builder.Default
    private Double temperature = 0.7;
    
    /**
     * 最大token数
     */
    @Builder.Default
    private Integer maxTokens = 2048;
    
    /**
     * Top P
     */
    @Builder.Default
    private Double topP = 1.0;
    
    /**
     * 频率惩罚
     */
    @Builder.Default
    private Double frequencyPenalty = 0.0;
    
    /**
     * 存在惩罚
     */
    @Builder.Default
    private Double presencePenalty = 0.0;
    
    /**
     * 停止词
     */
    private String[] stopWords;
    
    /**
     * 系统提示
     */
    private String systemPrompt;
    
    /**
     * 是否流式输出
     */
    @Builder.Default
    private Boolean stream = false;
    
    /**
     * 超时时间（毫秒）
     */
    @Builder.Default
    private Long timeout = 30000L;
    
    /**
     * 默认配置
     */
    public static GenerationConfig defaultConfig() {
        return GenerationConfig.builder()
                .temperature(0.7)
                .maxTokens(2048)
                .topP(1.0)
                .frequencyPenalty(0.0)
                .presencePenalty(0.0)
                .stream(false)
                .timeout(30000L)
                .build();
    }
    
    /**
     * 创造性配置
     */
    public static GenerationConfig creativeConfig() {
        return GenerationConfig.builder()
                .temperature(0.9)
                .maxTokens(2048)
                .topP(0.9)
                .frequencyPenalty(0.1)
                .presencePenalty(0.1)
                .stream(false)
                .timeout(30000L)
                .build();
    }
    
    /**
     * 精确配置
     */
    public static GenerationConfig preciseConfig() {
        return GenerationConfig.builder()
                .temperature(0.1)
                .maxTokens(2048)
                .topP(1.0)
                .frequencyPenalty(0.0)
                .presencePenalty(0.0)
                .stream(false)
                .timeout(30000L)
                .build();
    }
} 